package cn.jnetty.ioc.definition;
import cn.jnetty.api.annotation.JAutowired;
import cn.jnetty.api.exception.JnettyIocException;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 猪哥亮
 * @email 1030681978@qq.com
 * @date 2020/4/3 18:22
 * 描述：
 */
public class JAutowiredBeanDefinition extends JDefaultBeanDefinition{
    private Field field;
    private Object bean;
    public JAutowiredBeanDefinition(JAutowired autowired,Field field,Object bean) {
        super(autowired,field.getType());
        this.bean = bean;
        this.field = field;
        init();
    }
    @Override
    protected void init() {
        try {
            field.setAccessible(true);
            Field modifiersField  = Field.class.getDeclaredField("modifiers");
            modifiersField.setAccessible(true);
            modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
            //这里的值要从ioc中去取
            List<Object> var = JDefaultBeanDefinitionFactory.getInstance().getListByType(field.getType());
            if(var != null && var.size() > 0){
                if(var.size() > 1){
                    //如果是集合类型，可以直接注入
                    if(java.util.List.class.isAssignableFrom(field.getType()) || java.util.Set.class.isAssignableFrom(field.getType())){
                        field.set(this.bean, var);
                    }else {
                        throw new JnettyIocException("@JAutowired在注入<<{0}>>的=={1}字段时在容器中找到多个值。但该字段不是集合类型，所以不知道注入哪一个！请求包注入的对象唯一",bean.getClass().getName(),field.getType().getName());
                    }
                }else {
                    field.set(this.bean, var.get(0));
                }

            }else {
                if(((JAutowired)annotation).required()){
                    throw new JnettyIocException("注入的bean不能为空，如果该值可以为空请使用required = false在<<{0}>>的=={1}",bean.getClass().getName(),field.getType().getName());
                }
            }
        } catch (Exception e) {
            throw new JnettyIocException("@JAutowired装配注入失败对象{0},字段{1}",e,bean.getClass().getName(),field.getType().getName());
        }

    }
}
